#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution; // 画布尺寸
uniform vec2 u_mouse; // 鼠标位置
uniform float u_time; //时间

#define PI 3.1415926535897932384626433832795

// 随机函数
float random (vec2 st) {
    return fract(sin(dot(st.xy,vec2(12.9898,78.233)))*43758.5453123);
}

// 旋转函数
vec2 rotate(vec2 uv, float rotation, vec2 mid)
{
    return vec2(
      cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
      cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

// 噪声函数
float noise (in vec2 _st) {
    vec2 i = floor(_st);
    vec2 f = fract(_st);

    // Four corners in 2D of a tile
    float a = random(i);
    float b = random(i + vec2(1.0, 0.0));
    float c = random(i + vec2(0.0, 1.0));
    float d = random(i + vec2(1.0, 1.0));

    vec2 u = f * f * (3.0 - 2.0 * f);

    return mix(a, b, u.x) +
            (c - a)* u.y * (1.0 - u.x) +
            (d - b) * u.x * u.y;
}

//	Classic Perlin 2D Noise 
//	by Stefan Gustavson
//
vec4 permute(vec4 x)
{
    return mod(((x*34.0)+1.0)*x, 289.0);
}

vec2 fade(vec2 t)
{
    return t*t*t*(t*(t*6.0-15.0)+10.0);
}

float cnoise(vec2 P)
{
    vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
    vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
    Pi = mod(Pi, 289.0); // To avoid truncation effects in permutation
    vec4 ix = Pi.xzxz;
    vec4 iy = Pi.yyww;
    vec4 fx = Pf.xzxz;
    vec4 fy = Pf.yyww;
    vec4 i = permute(permute(ix) + iy);
    vec4 gx = 2.0 * fract(i * 0.0243902439) - 1.0; // 1/41 = 0.024...
    vec4 gy = abs(gx) - 0.5;
    vec4 tx = floor(gx + 0.5);
    gx = gx - tx;
    vec2 g00 = vec2(gx.x,gy.x);
    vec2 g10 = vec2(gx.y,gy.y);
    vec2 g01 = vec2(gx.z,gy.z);
    vec2 g11 = vec2(gx.w,gy.w);
    vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11));
    g00 *= norm.x;
    g01 *= norm.y;
    g10 *= norm.z;
    g11 *= norm.w;
    float n00 = dot(g00, vec2(fx.x, fy.x));
    float n10 = dot(g10, vec2(fx.y, fy.y));
    float n01 = dot(g01, vec2(fx.z, fy.z));
    float n11 = dot(g11, vec2(fx.w, fy.w));
    vec2 fade_xy = fade(Pf.xy);
    vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
    float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
    return 2.3 * n_xy;
}


void main() {
    vec2 vUv = gl_FragCoord.xy / u_resolution;
    // gl_FragColor = vec4(1.0, 0.0,0.0,1.0);
    // 1
    // gl_FragColor = vec4(vUv,0.0,1.0);
    // 2
    // float strlength = vUv.x;
    // gl_FragColor = vec4(strlength,strlength,strlength,1.0);
    // 3
    // float strlength = vUv.y;
    // gl_FragColor = vec4(strlength,strlength,strlength,1.0);
    // 4.
    // float strlength = 1. - vUv.y;
    // gl_FragColor = vec4(strlength,strlength,strlength,1.0);
    // 5
    // float strlength = step(0.5,mod(vUv.y * 10., 1.));
    // gl_FragColor = vec4(strlength,strlength,strlength,1.0);

    //6
    // float strlength = step(0.5,mod(vUv.y * 10., 1.));
    // strlength += step(0.5, mod(vUv.x * 10., 1.));
    // gl_FragColor = vec4(strlength,strlength,strlength,1.0);
    // 7
    // float strlength = step(0.5,mod(vUv.y * 10., 1.));
    // strlength -= step(0.5, mod(vUv.x * 10., 1.));
    // gl_FragColor = vec4(strlength,strlength,strlength,1.0);
    // 8
    // float strlength = step(0.5,mod(vUv.y * 10., 1.));
    // strlength *= step(0.5, mod(vUv.x * 10., 1.));
    // gl_FragColor = vec4(strlength,strlength,strlength,1.0);
    // 9
    // float barX = step(0.4, mod((vUv.x * 10.) - 0.2, 1.)) * step(0.8, mod(vUv.y * 10., 1.));
    // float barY = step(0.4, mod((vUv.y * 10.), 1.)) * step(0.8, mod(vUv.x * 10., 1.));
    // float strlength = barX + barY;
    // gl_FragColor = vec4(strlength,strlength,strlength,1.0);



    // 10
    // float strength = abs(vUv.x - 0.5);
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 11
    // float strength = min(abs(vUv.x - .5), abs(vUv.y - .5));
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 12
    // float strength = max(abs(vUv.x - .5), abs(vUv.y - .5));
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 13
    // float strength = step(0.2, max(abs(vUv.x - .5), abs(vUv.y - .5)));
    // gl_FragColor = vec4(strength,strength,strength, 1.);

    // 14
    // float strength = 1. - step(0.2, max(abs(vUv.x - .5), abs(vUv.y - .5)));
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 15
    // float strength = 1. - step(0.2, max(abs(vUv.x - .5), abs(vUv.y - .5)));
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 16
    // float strength = 1. - step(0.2, max(abs(vUv.x - .5), abs(vUv.y - .5)));
    // float strength = floor(vUv.x * 10.) / 10.;
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 17
    // float strength = floor(vUv.y * 10.) / 10.;
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 18
    // float strength = floor(vUv.y * 10.) / 10.;
    // strength *= floor(vUv.x * 10.) / 10.;
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 19
    // float strength = ceil(vUv.y * 10.) / 10. * ceil(vUv.x * 10.) / 10.;
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 20
    // float strength = random(vUv);
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 21
    // float strength = random(vUv);
    // float strength = ceil(vUv.x * 10.)/10. * ceil(vUv.y * 10.) / 10.;
    // strength = random(vec2(strength, strength));
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 22
    // float strength = length(vUv);
    // gl_FragColor = vec4(strength,strength,strength, 1.);
    // 23
    // float alpha =  1.0 - step(0.5,distance(vUv,vec2(0.5)));
    // float angle = atan(vUv.x-0.5,vUv.y-0.5);
    // float strength = (angle+3.14)/6.28;
    // gl_FragColor =vec4(strength,strength,strength,alpha);


    // vec2 rotateUv = rotate(vUv,3.14*0.25,vec2(0.5));
    // vec2 rotateUv = rotate(vUv,-u_time*5.0,vec2(0.5));
    // float alpha =  1.0 - step(0.5,distance(vUv,vec2(0.5)));
    // float angle = atan(rotateUv.x-0.5,rotateUv.y-0.5);
    // float strength = (angle+3.14)/6.28;
    // gl_FragColor =vec4(strength,strength,strength,alpha);

    // float strength = noise(vUv);
    // gl_FragColor =vec4(strength,strength,strength,1);


    // float strength =1.0 - abs(cnoise(vUv * 10.0)) ;
    // gl_FragColor =vec4(strength,strength,strength,1);


    vec3 purpleColor = vec3(1.0, 0.0, 1.0);
    vec3 greenColor = vec3(1.0, 1.0, 1.0);
    vec3 uvColor = vec3(vUv,1.0);
    float strength = step(0.9,sin(cnoise(vUv * 10.0)*20.0));
    gl_FragColor =vec4(strength,strength,strength,1);
}


